﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using JPSOFTWARE.BON.Modelos;
using JPSOFTWARE.BON.Regra;
using JPSoftwareMVC.Filtro;
using System.Web.Helpers;
using System.Net.Mail;

namespace JPSoftwareMVC.Areas.GestaoDistribuidora.Controllers
{
    public class DistribuidoraController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public JsonResult CarregarDistribuidoras()
        {
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            List<DistribuidoraView> lista = new List<DistribuidoraView>();
            lista = rnDistribuidora.ListarDistribuidoraViewAdministrar();                     
            return Json(lista, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        [HttpGet]
        [RegraAcesso(Roles = "Administrador")]
        public ActionResult GerenciarDistribuidoras()
        {
            return View();
        }

        [Authorize]
        [HttpGet]
        [RegraAcesso(Roles = "Administrador")]
        public ActionResult AlterarSituacaoDistribuidora(int id)
        {
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            DistribuidoraEditarModel distribuidoraModel = new DistribuidoraEditarModel();            

            ViewData["AlterarSituacaoDistribuidoraAlterado"] = false;

            distribuidoraModel = rnDistribuidora.EditarDistribuidora(id);			

            return View(distribuidoraModel);
        }

        [Authorize]
        [RegraAcesso(Roles="Administrador, Usuário")]
        public ActionResult VerificaSeExisteCNPJ(string cnpj)
        {
            var retorno = new Retorno();
            var rnDistribuidora = new RnDistribuidora();

            retorno.Sucesso = rnDistribuidora.VerificaSeExisteCNPJ(cnpj);

            return Json(!retorno.Sucesso, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        public ActionResult ValidarCNPJ(string cnpj)
        {
            var retorno = new Retorno();
            var rnDistribuidora = new RnDistribuidora();

            retorno.Sucesso = rnDistribuidora.ValidaCNPJ(cnpj);

            return Json(retorno.Sucesso, JsonRequestBehavior.AllowGet);
        }

        private void EnviarEmailAdministrador(int IdDistribuidora)
        {
            string _email = String.Empty;

            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            List<UsuarioView> usuarioView = new List<UsuarioView>();
            RnUsuario rnUsuario = new RnUsuario();
            DistribuidoraView distribuidoraView = new DistribuidoraView();
            MailMessage mailMessage = new MailMessage();

            distribuidoraView = rnDistribuidora.SelecionarDistribuidora(IdDistribuidora);
            usuarioView = rnUsuario.ListarUsuariosAdministradorView();

            foreach (UsuarioView item in usuarioView)
            {
                string email = item.Email;

                if (usuarioView.Count == 1)
                {
                    _email = email;
                }
                else
                {
                    _email += String.Concat(email, ";");                    
                }                
            }

            string[] tos = _email.Split(';');
            foreach (string to in tos)
            {
                if(to != "")
                mailMessage.To.Add(new MailAddress(to));
            }            

            string assunto = String.Empty;
            string mensagem = String.Empty;
            
            try
            {
                assunto = "Bebida Social - Nova Distribuidora Cadastrada";
                mensagem = "<div>Olá Administrador do Bebida Social," +
                    "<br>" +
                    "<br>" +
                    "Um novo usuário foi cadastrado no Bebida Social, verifique as informações do usuário para ativar este novo parceiro!" +
                "<br>" +
                "<br>" +
                "<h3>Dados da nova distribuidora</h3>" +
                "<b>CNPJ:</b> " + distribuidoraView.Cnpj + "<p>" +
                "<b>Nome da Distribuidora:</b> " + distribuidoraView.NomeDistribuidora + "<p>" +
                "<b>Endereço:</b> " + distribuidoraView.Endereco + "<p>" +
                "<b>Telefone:</b> " + distribuidoraView.Telefone + "<p>" +
                "<b>Celular:</b> " + distribuidoraView.Celular + "<p>" +
                "<b>E-mail:</b> " + distribuidoraView.Email + "<p>" +
                "<b>Bairro:</b> " + distribuidoraView.Bairro +"<p>" +
                "<b>Cidade:</b> " + distribuidoraView.Cidade +"<p>" +
                "<b>Estado:</b> " + distribuidoraView.Estado +"<p>" +
                 "<br>" +
                "<br>" +
                "Se não foi você que fez esta solicitação, por favor, ignore esta mensagem<br>" +
                "<br>" +
                "<br>" +
                "<br>" +
                "Obrigado por usar o Bebida Social<br>" +
                "------------------------------<wbr>-------------------------<br>" +
                "<br>" +
                "Não responda este email porque ele não pode ser lido<br></div>";

                //mensagem = "http://localhost:32086/Inicio/Confirmacao?Confirme=" + sha256 + "&Email=" + _email;

				//WebMail.SmtpServer = "mail.netitc.com.br";                
				//WebMail.SmtpPort = 2525;
				//WebMail.From = "naoresponda@bebidasocial.com.br";
				//WebMail.UserName = " naoresponda@bebidasocial.com.br";
				//WebMail.Password = "XperiaX8*";

				//WebMail.SmtpServer = "mail.bebidasocial.com.br";
				//WebMail.SmtpPort = 25;
				//WebMail.From = "contato@bebidasocial.com.br";
				//WebMail.UserName = " contato@bebidasocial.com.br";
				//WebMail.Password = "XperiaX8";
				//WebMail.Send(_email, assunto, mensagem);
                                            				
                mailMessage.From = new MailAddress("contato@bebidasocial.com.br");                
                mailMessage.Subject = assunto;
                mailMessage.Body = mensagem;                
				mailMessage.IsBodyHtml = true;
				SmtpClient emailClient = new SmtpClient("mail.bebidasocial.com.br", 25);
				System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("contato@bebidasocial.com.br", "XperiaX8");
				emailClient.UseDefaultCredentials = false;
				emailClient.Credentials = SMTPUserInfo;
				emailClient.Send(mailMessage);
                emailClient.Dispose();
            }
            catch (SmtpFailedRecipientsException ex)
            {
                for (int i = 0; i < ex.InnerExceptions.Length; i++)
                {
                    SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
                    if (status == SmtpStatusCode.MailboxBusy ||
                        status == SmtpStatusCode.MailboxUnavailable)
                    {
                        Console.WriteLine("Ops! Uma falha ocorreu ao enviar um e-mail para você! - Tentando reenviar em 5 segundos.");
                        System.Threading.Thread.Sleep(5000);
                        WebMail.Send(_email, assunto, mensagem);
                    }
                    else
                    {
                        Console.WriteLine("Falha ao enviar mensagem para {0}",
                            ex.InnerExceptions[i].FailedRecipient);
                    }
                }
            }
            catch (SmtpException smtpEx)
            {
                throw smtpEx;
            }
        }

		private void EnviarEmailDistribuidora(int IdDistribuidora)
		{
			string _email = String.Empty;

			RnDistribuidora rnDistribuidora = new RnDistribuidora();
			List<UsuarioView> usuarioView = new List<UsuarioView>();
			RnUsuario rnUsuario = new RnUsuario();
			DistribuidoraView distribuidoraView = new DistribuidoraView();

			distribuidoraView = rnDistribuidora.SelecionarDistribuidora(IdDistribuidora);
			usuarioView = rnUsuario.ListarUsuariosAdministradorView();

			foreach (var item in usuarioView)
			{
				string email = item.Email;

				if (usuarioView.Count == 1)
				{
					_email = email;
				}
				else
				{
					_email = String.Concat(email, ";");
				}
			}
			string assunto = String.Empty;
			string mensagem = String.Empty;

			try
			{
				assunto = "Bebida Social - Ativação de Distribuidora";
				mensagem = "<div>Olá "+ distribuidoraView.NomeDistribuidora +
					"<br>" +
					"<br>" +
					"Informamos que a distribuidora " +	distribuidoraView.NomeDistribuidora + " foi ativado pelo nosso sistema."+
					"<br>" +
					"Faça o Login no Bebida Social e começe a cadastrar seus produtos." +				
				 "<br>" +
				"<br>" +
				"Se não foi você que fez esta solicitação, por favor, ignore esta mensagem<br>" +
				"<br>" +
				"<br>" +
				"<br>" +
				"Obrigado por usar o Bebida Social<br>" +
				"------------------------------<wbr>-------------------------<br>" +
				"<br>" +
				"Não responda este email porque ele não pode ser lido<br></div>";

				//mensagem = "http://localhost:32086/Inicio/Confirmacao?Confirme=" + sha256 + "&Email=" + _email;

				//WebMail.SmtpServer = "mail.netitc.com.br";                
				//WebMail.SmtpPort = 2525;
				//WebMail.From = "naoresponda@bebidasocial.com.br";
				//WebMail.UserName = " naoresponda@bebidasocial.com.br";
				//WebMail.Password = "XperiaX8*";

				//WebMail.SmtpServer = "mail.bebidasocial.com.br";
				//WebMail.SmtpPort = 25;
				//WebMail.From = "contato@bebidasocial.com.br";
				//WebMail.UserName = " contato@bebidasocial.com.br";
				//WebMail.Password = "XperiaX8";
				//WebMail.Send(_email, assunto, mensagem);

				MailAddressCollection colecaoEmail = new MailAddressCollection();

				MailMessage mailMessage = new MailMessage("contato@bebidasocial.com.br", distribuidoraView.Email, assunto, mensagem);
				mailMessage.IsBodyHtml = true;				 
				//Enviar esta informação para os administradores do sistema.
				SmtpClient emailClient = new SmtpClient("mail.bebidasocial.com.br", 25);
				System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("contato@bebidasocial.com.br", "XperiaX8");
				emailClient.UseDefaultCredentials = false;
				emailClient.Credentials = SMTPUserInfo;
				emailClient.Send(mailMessage);
			}
			catch (SmtpFailedRecipientsException ex)
			{
				for (int i = 0; i < ex.InnerExceptions.Length; i++)
				{
					SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
					if (status == SmtpStatusCode.MailboxBusy ||
						status == SmtpStatusCode.MailboxUnavailable)
					{
						Console.WriteLine("Ops! Uma falha ocorreu ao enviar um e-mail para você! - Tentando reenviar em 5 segundos.");
						System.Threading.Thread.Sleep(5000);
						WebMail.Send(_email, assunto, mensagem);
					}
					else
					{
						Console.WriteLine("Falha ao enviar mensagem para {0}",
							ex.InnerExceptions[i].FailedRecipient);
					}
				}
			}
			catch (SmtpException smtpEx)
			{
				throw smtpEx;
			}
		}

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        [HttpGet]
        public ActionResult IncluirDistribuidora()
        {
            ViewData["DistribuidoraInserida"] = false;

            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        [HttpPost]
        public ActionResult IncluirDistribuidora(DistribuidoraIncluirModel distribuidoraIncluirModel)
        {
            var rnDistribuidora = new RnDistribuidora();
            Retorno retorno = new Retorno();
            DistribuidoraIncluirModel dados = new DistribuidoraIncluirModel();

            if (Session["DadosUsuario"] != null)
            {
                var usuarioModel = Session["DadosUsuario"] as UsuarioModel;

                if (usuarioModel != null)
                {
                    dados = rnDistribuidora.IncluirDistribuidora(distribuidoraIncluirModel, usuarioModel.IdUsuario);

                    if (dados.IdDistribuidora > 0)
                    {
                        ViewData["DistribuidoraInserida"] = true;
                        ViewData["Mensagem"] = Mensagens.MSG_005;
                        EnviarEmailAdministrador(dados.IdDistribuidora);
                    }
                    else if (dados.Cnpj == null)
                    {
                        ViewData["DistribuidoraErro"] = Mensagens.MSG_023;
                        ViewData["DistribuidoraInserida"] = false;
                    }
                    else
                    {
                        ViewData["DistribuidoraErro"] = Mensagens.MSG_006;
                        ViewData["DistribuidoraInserida"] = false;
                    }
                }
            }
            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        [HttpGet]
        public ActionResult EditarDistribuidora(int id)
        {
            var rnDistribuidora = new RnDistribuidora();
            var distribuidoraEditarModel = new DistribuidoraEditarModel();

            if (Session["DadosUsuario"] != null)
            {
                var usuarioModel = Session["DadosUsuario"] as UsuarioModel;

                if (usuarioModel != null)
                    distribuidoraEditarModel = rnDistribuidora.EditarDistribuidora(id);

                if (distribuidoraEditarModel != null)
                {
                    ViewData["Latitude"] = distribuidoraEditarModel.Latitude;
                    ViewData["Longitude"] = distribuidoraEditarModel.Longitude;
                    ViewData["IdDistribuidora"] = distribuidoraEditarModel.IdDistribuidora;
                }
            }
            return View(distribuidoraEditarModel);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]
        [HttpPost]
        public ActionResult EditarDistribuidora(DistribuidoraEditarModel distribuidoraEditarModel)
        {
            var rnDistribuidora = new RnDistribuidora();
            Retorno retorno = new Retorno();

            if (Session["DadosUsuario"] != null)
            {
                var usuarioModel = Session["DadosUsuario"] as UsuarioModel;
                if (usuarioModel != null)
                {
                    retorno = rnDistribuidora.EditarDistribuidora(distribuidoraEditarModel);
                    if (retorno.Sucesso)
                    {
                        ViewData["EditarDistribuidora"] = true;
                        ViewData["Mensagem"] = retorno.Mensagem;

						//Envia Email para a Distribuidora informando que a mesma foi ativada
						if (distribuidoraEditarModel.Status == true)
						{
							EnviarEmailDistribuidora(distribuidoraEditarModel.IdDistribuidora);
						}
                    }
                    else
                    {
                        ViewData["DistribuidoraErro"] = retorno.Mensagem;
                        ViewData["EditarDistribuidora"] = false;
                    }
                }                                
            }
            return View();
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]        
        public ActionResult MinhaDistribuidora()
        {
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            List<DistribuidoraView> ListarDistribuidoraView = new List<DistribuidoraView>();

            if (Session["DadosUsuario"] != null)
            {
                UsuarioModel usuarioModel = Session["DadosUsuario"] as JPSOFTWARE.BON.Modelos.UsuarioModel;

                ListarDistribuidoraView = rnDistribuidora.ListarDistribuidoraView(usuarioModel.IdUsuario);

                int _IdDistribuidora = ListarDistribuidoraView.Select(x => x.IdDistribuidora).FirstOrDefault();

                ViewData["IdDistribuidora"] = _IdDistribuidora;
            }
            return View(ListarDistribuidoraView);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]        
        [HttpGet]
        public JsonResult ExibirExcluirDistribuidora(int id)
        {
            DistribuidoraView DistribuidoraView = new DistribuidoraView();
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            ViewData["IdDistribuidora"] = id;
            object dadosJson = new object();

            if (Session["DadosUsuario"] != null)
            {
                UsuarioModel usuarioModel = Session["DadosUsuario"] as JPSOFTWARE.BON.Modelos.UsuarioModel;

                DistribuidoraView = rnDistribuidora.SelecionarDistribuidora(id, usuarioModel.IdUsuario);

                dadosJson = new
                {
                    IdDistribuidora = DistribuidoraView.IdDistribuidora,
                    Cnpj = DistribuidoraView.Cnpj,
                    Distribuidora = DistribuidoraView.NomeDistribuidora,
                    Descricao = DistribuidoraView.Descricao,
                    Status = DistribuidoraView.Status
                };
            }
            return Json(dadosJson, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        [RegraAcesso(Roles = "Administrador, Usuário")]        
        public JsonResult ExcluirDistribuidora(int id)
        {
            Retorno retorno = new Retorno();
            RnDistribuidora rnDistribuidora = new RnDistribuidora();
            retorno = rnDistribuidora.ExcluirDistribuidora(id);
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
    }
}
